//声明类:  mazePath 用来存储迷宫路径的栈
//        maze 迷宫地图的存储与操作

#ifndef MAZE_H
#define MAZE_H

//用来存储迷宫路径的栈的类
//迷宫以左上角为原点(1,1)，向下为横坐标xPos，向右为纵坐标yPos
class mazePath
{
public:
    int xPos;   //迷宫的横坐标
    int yPos;   //迷宫的纵坐标
    int dire;   //下一步的方向
    mazePath* nextStep;     //下一步
    mazePath* otherPath;    //下一个路径
    mazePath();     //构造函数
    ~mazePath();    //析构函数
    int stackIn(int x, int y, int d);   //下一步进栈
                                        //x 步的横坐标，y 步的纵坐标，d 步的方向
    int stackOut();         //栈顶步出栈
    mazePath* getTop();     //获取栈顶
};

//迷宫的存储与操作类
class maze
{
private:
    int mazeMap[50][50];    //地图数据，1表通路，0表断路
    int stepSign[50][50];   //1表点已拾取，0表未拾取
    int mapSize;            //地图的边长
    mazePath* resultPath;   //用来求迷宫过程中记录路径的栈
    mazePath* finalPath;    //储存最后结果的栈
    int pathNum;            //迷宫路径条数

    int isMapSeted;     //地图是否已设置，1是，0否
    int isSolved;       //迷宫是否已解，1是，0否
    int savePath();     //将计算出的路径从resultPath保存到finalPath中
    int initMaze();     //初始化迷宫
public:
    maze();     //构造函数
    ~maze();    //析构函数
    int setMap(int** newMap, int s);    //从二维数组中设置迷宫
                                        //newMap 迷宫地图, s 迷宫地图边长
    int setMap(char* filePath);         //从文件中构造迷宫, filePath迷宫文件路径
    int solveMap();         //求解迷宫
    int printPath();        //打印迷宫路径
    int printMap();         //打印迷宫地图
    int saveMap(char* filePath);        //保存迷宫到文件路径中
    int createMap(int s);   //随机产生边长为s的迷宫地图（不一定可解）
    int createRunableMap(int s, int q = 2);     //随机产生边长为s的可解迷宫地图
                                                //q为地图精细程度，取1（较粗糙），2，3（较精细）
    int getPathNum();   //迷宫解的个数
    int getMapSize();   //迷宫地图边长
    int getIsSolved();
    int getIsMapSeted();
    const int* getMazeMap();                //获取迷宫地图
    mazePath* getFinalPath(int p);    //获取指定的迷宫的解，p为解的序号


};

#endif // MAZE_H
